/*
 * Message.h
 *
 *  Created on: 2020年11月30日
 *      Author: san
 */

#ifndef MESSAGE_H_
#define MESSAGE_H_

#include <string>
#include <set>
#include <iostream>

#include "Folder.h"

class Message {
	friend class Folder;
public:

	// 构造函数和析构函数
	Message(std::string str = ""): contents(str) {}  // folders被隐式初始化为空
	Message(const Message &);
	virtual ~Message();
	// 移动构造函数
	Message(Message &&m): contents(std::move(m.contents)) { move_Folders(&m); }
	// 移动赋值运算符
	Message &operator=(Message &&);

	// 重载赋值运算符
	Message &operator=(const Message &);

	// 从给定Folder种删除/添加本Message
	void save(Folder&);
	void remove(Folder&);

	// 交换两条信息
	void swap(Message &lhs, Message &rhs);

	// 打印短信内容
	void print() { std::cout << "1" << contents << std::endl; }
	std::string getContents(){ return contents; }

	// 将本Message添加/删除从给定的Folder中
	void addFolder(Folder &f) { folders.insert(&f); f.msgs.insert(this); }
	void remFolder(Folder &f) { folders.erase(&f); f.msgs.erase(this); }


private:
	std::string contents;  // 消息内容
	std::set<Folder*> folders;  // 包含此消息的消息文件夹
	void move_Folders(Message *);  // 从本Message移动指针

	// 两个工具函数
	// 将本message添加到指定（Message&）的folder中
	void add_to_Folders(const Message&);
	// 从folders中的每个Folder删除本Message
	void remove_from_Folders();
};

#endif /* MESSAGE_H_ */
